﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Configuration;
using CSP.Common.Tools;

namespace CSP.Common.Factories
{
    public class CookieFactory
    {
        private static string _domain = "";

        private DateTime _expires;

        private static string _cookiePre = "";

        private static string _cookiePath = "";

        private bool _httpOnly = false;

        private string _name;

        private string _path;

        private bool _secure = false;

        private string _value;

        /// <summary>
        /// Cookie 域
        /// </summary>
        public string Domain
        {
            get { return _domain; }
            set { _domain = value; }
        }
        //
        // 摘要:
        //     获取或设置此 Cookie 的过期日期和时间。
        //
        // 返回结果:
        //     此 Cookie 的过期时间（在客户端）。
        public DateTime Expires
        {
            get { return _expires; }
            set { _expires = value; }
        }

        //
        // 摘要:
        //     获取一个值，通过该值指示 Cookie 是否具有子键。
        //
        // 返回结果:
        //     如果 Cookie 具有子键，则为 true；否则为 false。默认为 false。
        //public bool HasKeys { get; }
        //
        // 摘要:
        //     获取或设置一个值，该值指定 Cookie 是否可通过客户端脚本访问。
        //
        // 返回结果:
        //     如果 Cookie 具有 HttpOnly 属性且不能通过客户端脚本访问，则为 true；否则为 false。默认值为 false。
        public bool HttpOnly
        {
            get { return _httpOnly; }
            set { _httpOnly = value; }
        }

        //
        // 摘要:
        //     获取或设置 Cookie 的名称。
        //
        // 返回结果:
        //     除非构造函数另外指定，否则默认值为 null 引用（在 Visual Basic 中为 Nothing）。
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        //
        // 摘要:
        //     获取或设置要与当前 Cookie 一起传输的虚拟路径。
        //
        // 返回结果:
        //     要与此 Cookie 一起传输的虚拟路径。默认值为当前请求的路径。
        public string Path
        {
            get { return _path; }
            set { _path = value; }
        }

        //
        // 摘要:
        //     获取或设置一个值，该值指示是否使用安全套接字层 (SSL)（即仅通过 HTTPS）传输 Cookie。
        //
        // 返回结果:
        //     如果通过 SSL 连接 (HTTPS) 传输 Cookie，则为 true；否则为 false。默认为 false。
        public bool Secure
        {
            get { return _secure; }
            set { _secure = value; }
        }

        //
        // 摘要:
        //     获取或设置单个 Cookie 值。
        //
        // 返回结果:
        //     Cookie 的值。默认值为 null 引用（在 Visual Basic 中为 Nothing）。
        public string Value
        {
            get { return _value; }
            set { _value = value; }
        }

        private CookieFactory()
        {
          

            if (string.IsNullOrWhiteSpace(_domain))
            {
                _domain = ConfigurationManager.AppSettings["CookieDomain"].ToString();
            }

            if (string.IsNullOrWhiteSpace(_cookiePath))
            {
                _cookiePath = ConfigurationManager.AppSettings["CookiePath"].ToString();
            }

            if (string.IsNullOrWhiteSpace(_cookiePre))
            {
                _cookiePre = ConfigurationManager.AppSettings["CookiePre"].ToString();
                _cookiePre = _cookiePre+CommonTool.MD5(_cookiePath + "|" + _domain).Substring(0, 4)+"_";
            }
            
            
            
        }

        public static CookieFactory GetInstace()
        {
            return new CookieFactory();
        }

        /// <summary>
        /// 种植Cookie
        /// </summary>
        /// <param name="page">当前请求的页面,传递this</param>
        public void SetCookie(Page page, string name, string val)
        {
            if (!string.IsNullOrWhiteSpace(name))
            {
                _name = _cookiePre + name;
            }
            if (!string.IsNullOrWhiteSpace(val))
            {
                _value = val;
            }
            HttpCookie cookie = new HttpCookie(_name, page.Server.UrlEncode(_value));
            cookie.Domain = _domain;
            if (_expires != null)
            {
                cookie.Expires = _expires;
            }
            page.Response.Cookies.Set(cookie);
        }


        public string GetCookie(Page page, string name)
        {
            if (!string.IsNullOrWhiteSpace(name))
            {
                _name = _cookiePre + name;
            }
            HttpCookie cookie = page.Request.Cookies.Get(_name);
            if (cookie != null)
            {
                return page.Server.UrlDecode(cookie.Value);
            }
            return "";

        }

        /// <summary>
        /// 删除Cookie
        /// </summary>
        /// <param name="page">当前请求的页面,传递this</param>
        /// <param name="name">指定Cookie的名称</param>
        public void RemoveCookie(Page page, string name)
        {
            if (!string.IsNullOrWhiteSpace(name))
            {
                _name = _cookiePre + name;
            }
            HttpCookie cookie = new HttpCookie(_name, _value);
            cookie.Domain = _domain;
            if (_expires != null)
            {
                cookie.Expires = DateTime.Now.AddDays(-1);
            }
            page.Response.Cookies.Set(cookie);
        }

        /// <summary>
        /// 根据名称获取全名称
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string GetFullNameByName(string name)
        {
            return _cookiePre + name;
        }
    }
}
